package top.iridescent;

import com.sun.xml.internal.ws.api.client.ServiceInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

@Slf4j
public class BitwiseOperators {


    /**
     * 位逻辑运算符
     * 位逻辑运算符包含 4 个：&（与）、|（或）、~（非）和 ^（异或）。除了 ~（即位取反）为单目运算符外，其余都为双目运算符。
     */

    /**
     * &，其运算规则是：参与运算的数字，低位对齐，高位不足的补零，如果对应的二进制位同时为 1，那么计算结果才为 1，否则为 0。因此，任何数与 0 进行按位与运算，其结果都为 0。
     */
    @Test
    public void test1() {
        //int x=  100&0;
        //log.info("----"+x+"===");
        int x = 5, y = 12; // 创建整型变量保存两个数
        int z = x & y;
        log.info("===" + z + "===");
    }

    /**
     * 位或运算符为 |，其运算规则是：参与运算的数字，低位对齐，高位不足的补零。如果对应的二进制位只要有一个为 1，那么结果就为 1；如果对应的二进制位都为 0，结果才为 0。
     */
    @Test
    public void test2() {
        log.info("===" + (11 | 7) + "===");
        log.info("===" + Integer.toBinaryString(11) + "===");
        log.info("===" + Integer.toBinaryString(7) + "===");
        log.info("===" + Integer.toBinaryString(11 | 7) + "===");
    }

    /**
     * 位异或运算符为 ^，其运算规则是：参与运算的数字，低位对齐，高位不足的补零，如果对应的二进制位相同（同时为 0 或同时为 1）时，结果为 0；如果对应的二进制位不相同，结果则为 1。
     */
    @Test
    public void test3() {
        log.info("===" + (11 ^ 7) + "===");
        log.info("===" + Integer.toBinaryString(11) + "===");
        log.info("===" + Integer.toBinaryString(7) + "===");
        log.info("===" + Integer.toBinaryString(11 ^ 7) + "===");
    }

    /**
     * 位取反运算符为 ~，其运算规则是：只对一个操作数进行运算，将操作数二进制中的 1 改为 0，0 改为 1。
     */
    @Test
    public void test4() {
        log.info("===" + (~7) + "===");
        log.info("===" + Integer.toBinaryString(7) + "===");
        log.info("===" + Integer.toBinaryString(~7) + "===");
    }

    @Test
    public void test5() {
        System.out.println(true & true);
        System.out.println(true | true);
        System.out.println(false ^ false);
        // System.out.println(~true);
    }

    /**
     * 左移位运算符为<<，其运算规则是：按二进制形式把所有的数字向左移动对应的位数，高位移出（舍弃），低位的空位补零。
     */
    @Test
    public void test6() {
        log.info("===" + (1100005778 >> 7) + "===");
        log.info("===" + (1100005778 / 2/2/2/2/2/2/2) + "===");
        log.info("===" + Integer.toBinaryString(11) + "===");
        log.info("===" + Integer.toBinaryString(7) + "===");
        log.info("===" + Integer.toBinaryString(11 << 7) + "===");
    }

    /**
     * 右位移运算符为 >>，其运算规则是：按二进制形式把所有的数字向右移动对应的位数，低位移出（舍弃），高位的空位补零
     */
    @Test
    public void test7() {
        log.info("===" + (11 >> 1) + "===");
        log.info("===" + Integer.toBinaryString(11) + "===");
        log.info("===" + Integer.toBinaryString(1) + "===");
        log.info("===" + Integer.toBinaryString(11 >> 1) + "===");
    }


    @Test
    public  void  test11(){
        StringBuffer sql=new StringBuffer();
        sql.append(" select a.subject_id,                                 		  ");
        sql.append("                a.subject_name,                               ");
        sql.append("                a.frame_id,                                   ");
        sql.append("                y.frame_name,                                 ");
        sql.append("                a.data_cycle,                                 ");
        sql.append("                a.begin_date,                                 ");
        sql.append("                a.end_date,                                   ");
        sql.append("                a.flush_type,                                 ");
        sql.append("                a.bus_info,                                   ");
        sql.append("                a.key_words,                                  ");
        sql.append("                a.region_id, a.share_type,                    ");
        sql.append("                a.oper_id, a.create_time,                     ");
        sql.append("                nvl(ebo.user_name ,a.oper_id) oper_name,      ");
        sql.append("                0              is_system_subject,             ");
        sql.append("                a.task_state   as state,                      ");
        sql.append("                a.subject_type                   ");
        sql.append("           from edc_subject a ");
            // 数据范围
            sql.append(" join edc_subject_area ea on a.subject_id=ea.subject_id and ea.area_id= ? ");

        sql.append(" join " + "product"+ "st_frame y  on a.frame_id = y.frame_id ");
        // 关联操作员
        sql.append(" join EDC_BIS_OPERATOR ebo on ebo.user_id = a.oper_id ");
            sql.append(" and ebo.user_name like ? ");

        // 客户群分类查询

 sql.append(" and to_char(a.create_time, 'yyyymmdd') >= ? ");

            sql.append(" and to_char(a.create_time, 'yyyymmdd') <= ? ");

        //兼容oracle和gp的模型
        sql.append(" and a.db_source = 2 ");
        sql.append(" order by a.share_type desc,a.create_time desc ");
        System.out.println(sql.toString());
    }
}
